約 3,765,063 件
https://w.atwiki.jp/s-soft/pages/11.html
起動 /usr/bin/mysqld_safe 停止 mysqladmin -u root shutdown 【参考情報】 MySQLクイック・リファレンス http //www.bitscope.co.jp/tep/MySQL/quickMySQL.html
https://w.atwiki.jp/th0901/pages/24.html
オンラインでのデータ領域のコピーによるバックアップ時は、ソケットファイル(mysql.sock)のcpが出来ない Snapshotを用いたバックアップの流れ(InnoDBのみ) Snapshotを取得 ※InnoDBにはリカバリ機能があるので、MySQLエラーログにバイナリログのポジション情報が表示される為 Snapshotを用いたバックアップの流れ(MyISAMを含む) FLUSH TABLES WITH READ LOCK ポジション情報取得(SHOW MASTER STATUS) Snapshot取得 UNLOCK TABLES Snapshotを用いたバックアップのリカバリ流れ(InnoDBのみ) Snapshotからデータを戻す MySQL起動 # /etc/init.d/mysql start バイナリログのポジション確認(MySQL起動時のエラーログにポジション情報が出力されるので、以下のコマンドで抜き出す) # cat /var/log/mysql/mysqld.err | grep "Last MySQL binlog file" InnoDB Last MySQL binlog file position 0 8346, file name /var/lib/mysql/binlog/mysql-bin.000045 バイナリログの適用 # mysqlbinlog --no-defaults --disable-log-bin --start-position="8346" \ /var/lib/mysql/binlog/mysql-bin.000045 /var/lib/mysql/binlog/mysql-bin.000045 roll_forward # mysql -uroot -p roll_forward バイナリログの適用ポジション位置(スレーブでバックアップを取得している場合) mysql show slave status\G *************************** 1. row *************************** Slave_IO_State Waiting for master to send event Master_Host 172.22.100.99 Master_User repl Master_Port 3306 Connect_Retry 60 *3 Master_Log_File mysql-bin.000001 *4 Read_Master_Log_Pos 796577522 Relay_Log_File mysql-relay.000108 Relay_Log_Pos 30105 *1 Relay_Master_Log_File mysql-bin.000001 Slave_IO_Running Yes Slave_SQL_Running Yes Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno 0 Last_Error Skip_Counter 0 *2 Exec_Master_Log_Pos 796577522 Relay_Log_Space 30401 Until_Condition None Until_Log_File Until_Log_Pos 0 Master_SSL_Allowed No Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master 0 Master_SSL_Verify_Server_Cert No Last_IO_Errno 0 Last_IO_Error Last_SQL_Errno 0 Last_SQL_Error 1 row in set (0.00 sec) ※マスターのリカバリが必要で、かつマスターのバイナリログを使う場合は、 スレーブサーバでバックアップ取得時のSHOW SLAVE STATUSの結果で *1 Relay_Master_Log_File mysql-bin.000001 *2 Exec_Master_Log_Pos 796577522 を元にマスターのバイナリログを適用する。 *3 Master_Log_File I/Oスレッドが現在読み込んでいるマスタバイナリログファイルの名前 *4 Read_Master_Log_Pos I/Oスレッドが読み込んだところまでのマスタバイナリログ内での位置。 *1 Relay_Master_Log_File SQLスレッドによって実行された一番最近のイベントを含むマスタバイナリログファイルの名前。 *2 Exec_Master_Log_Pos SQLスレッドによって実行された最後のイベントのマスタバイナリログでの位置 ※マスタバイナリログ内の(Relay_Master_Log_FileとExec_Master_Log_Pos)はリレーログ内の(Relay_Log_FileとRelay_Log_Pos)に対応している
https://w.atwiki.jp/benewnarusuji/pages/14.html
デフォルト mysql status -------------- mysql Ver 14.12 Distrib 5.0.45, for Win32 (ia32) Server characterset sjis Db characterset sjis Client characterset sjis Conn. characterset sjis mysql show variables like %char% ; +--------------------------+------------------------------+ | Variable_name | Value | +--------------------------+------------------------------+ | character_set_client | sjis | | character_set_connection | sjis | | character_set_database | sjis | | character_set_filesystem | binary | | character_set_results | sjis | | character_set_server | sjis | | character_set_system | utf8 | | character_sets_dir | H \mysql\share\charsets\ | +--------------------------+------------------------------+ 文字コードセット(ujis) mysql set names ujis; mysql status Server characterset sjis Db characterset sjis Client characterset ujis --変化 Conn. characterset ujis --変化 mysql show variables like %char% ; +--------------------------+--------------------------+ | Variable_name | Value | +--------------------------+--------------------------+ | character_set_client | ujis | --変化 | character_set_connection | ujis | --変化 | character_set_database | sjis | | character_set_filesystem | binary | | character_set_results | ujis | --変化 | character_set_server | sjis | | character_set_system | utf8 | | character_sets_dir | H \mysql\share\charsets\ | +--------------------------+--------------------------+
https://w.atwiki.jp/nicepaper/pages/142.html
配列で取得するのはよく見かけますが、1件だけの場合どうすればよいのでしょうか? たとえば更新ページの更新一覧にあるGETメソッドのリンクを押した際の表示するphpのコードです。7月18日記事 目次 更新記事のテーブル設計 コード HTML部分 まとめ 更新記事のテーブル設計 テーブルのカラムはそれぞれ、id,info_date,regi_date,title,text,url,status(id(主キー)、公開日、登録日、タイトル、テキスト内容、URL、status)だとします。 また、statusが2の場合、その記事は公開対象ということだとします。 コード データベースの情報はconfig.phpファイルに保存しておきdefine関数でDB_NAMEやDB_HOSTを定義しているものだとします。また、idをGETメソッドで引き継いで、その情報を使ってデータベースにクエリを送信する状況だとするコードを書いていきたいと思います。 ?php require( config.php ); $dsn = mysql dbname= .DB_NAME. ;host= .DB_HOST. ;port= .DB_PORT. ; $user = DB_USER; $password = DB_PASSWORD; try{ $dbh = new PDO($dsn, $user, $password); }catch (PDOException $e){ print( Connection failed .$e- getMessage()); die(); } //GETメソッドの数値のフィルター。文字列等をいれられた場合なにも返さない。 $filter_id = filter_var($_GET[id],FILTER_SANITIZE_NUMBER_INT,FILTER_NULL_ON_FAILURE); $stmt = $dbh- prepare("SELECT * FROM テーブル名 WHERE id = id AND status = 2 "); $stmt- bindParam( id ,$filter_id,PDO PARAM_INT); $stmt- execute(); $result = $stmt- fetch(); ? HTML部分 あとは任意の位置に内容を張っていくだけです。 HTML部 タイトル部分などに h1 ?php echo htmlspecialchars($result[title],ENT_QUOTES,"UTF-8"); ? /h1 や文字コード変換を含めるなら h1 ?php echo htmlspecialchars(mb_convert_encoding($result[title],"UTF-8","EUC-JP"),ENT_QUOTES,"UTF-8"); ? /h1 と書く。 あるいは テキスト部分を張りたいなら p ?php echo nl2br(htmlspecialchars($result[text],ENT_QUOTES,"UTF-8")); ? /p や文字コード変換を含めるなら p ?php echo nl2br(htmlspecialchars(mb_convert_encoding($result[text],"UTF-8","EUC-JP"),ENT_QUOTES,"UTF-8")); ? /p と改行を表示させるnl2br関数も書いていきます。 まとめ idをフィルターし、それをbindValueでチェックし、一件だけの取得の場合fetch()を使うようにします。 idのフィルターはPDOによってチェックされるので必要ないかもしれませんが、著者のセキュリティ意識だと思ってください。 以上
https://w.atwiki.jp/nicepaper/pages/66.html
前回記事MySQLでテーブル作成1ではテーブルを作成しました。今回はそのテーブルに対して色々な操作をし、理解を深めていきたいと思います。6月1日記事 目次 テーブルの情報を取得する テーブルがまずあるか確認する。 テーブルの構造を見てみる。 テーブルにフィールドを挿入してみる。 挿入 確認 違った値を挿入してみる。 確認 フィールドを削除してみる。 削除 確認 値や文字列の情報を変更してみる。 変更 確認 テーブルの情報を取得する テーブルがまずあるか確認する。 データベースを選択していなければ。 mysql use データベース名; データベースを選択後 mysql SHOW TABLES; すると次のように表示されるはずです。 mysql show tables; +-----------------------+ | Tables_in_nicepaperdb | +-----------------------+ | information | +-----------------------+ 1 row in set (0.00 sec) テーブルの構造を見てみる。 mysql DESC information; すると以下のように出てきます。 +-----------+--------------+------+-----+------------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+--------------+------+-----+------------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | info_date | date | NO | MUL | 0000-00-00 | | | title | varchar(255) | NO | | | | | type | tinyint(1) | NO | | 0 | | | info_text | text | NO | | NULL | | | url | varchar(255) | NO | | | | | status | tinyint(1) | NO | MUL | 0 | | +-----------+--------------+------+-----+------------+----------------+ 7 rows in set (0.01 sec) テーブルにフィールドを挿入してみる。 挿入 本来、phpや他のプログラムの方でMySQLのクエリを実行するので、コマンドラインで挿入することはないです。ただ、値がちゃんと格納されるか等の確認をし、検索もできるかを確認したいと思います。 mysql INSERT INTO information (info_date, title , type ,info_text , url ,status) VALUES ( 2015-06-01 , サイトオープンしました , 1 , サイトオープンしました。今後ともよろしくお願い致します。 , http //www63.atwiki.jp/nicepaper/pages/1.html , 1 ); 文法:INSERT INTO テーブル名(カラム名1,カラム名2,カラム名3...) VALUES (値1,値2,値3....);と書いていきます。値に関してはシングルクオーテーションを付けていきます。また、idの宣言および挿入値の宣言は必要ないです。 確認 mysql SELECT * FROM information; コピペすると、形がかなり崩れるので、表示しません。ご了承ください。アスタリスク(*)はフィールドの全情報を取得するという意味です。 違った値を挿入してみる。 違う型を入れたデータを挿入してみる。typeの部分は数値型なのですが、文字列を入れてみます。typeの部分に「ニュース」というものを入れてみます。 mysql INSERT INTO information (info_date, title , type ,info_text , url ,status) VALUES ( 2015-06-01 , サイトオープンしました , ニュース , サイトオープンしました。今後ともよろしくお願い致します。 , http //www63.atwiki.jp/nicepaper/pages/1.html , 1 ); Query OK, 1 row affected, 1 warning (0.00 sec) 確認 確かに挿入はできるのですが、テーブルを見てみるとどうでしょうか。 mysql SELECT * FROM information WHERE id = 2 ; するとtypeの値がデフォルトの0になっていることが確認できると思います。 数字入れてどうするの?と思いがちな方もいらっしゃると思いますが、プログラムでデータベースの値を読み取って、値が1ならニュース、値が2ならIR情報などと表示させるようにプログラムさせればいいだけです。 フィールドを削除してみる。 削除 設計でstatusの数値に関して公開は2、下書きは1、削除は0と設計しています。履歴を残す場合statusの部分を0にすれば、データベースには残り、フロントエンド側には表示されずにすることができます。なので以下の行為はあまり意味ないですが、やってみましょう。 mysql DELETE FROM information WHERE id = 2 ; 無事削除ができました。 確認 再び挿入してみるとidはどう変化するのでしょうか?確認してみます。 mysql INSERT INTO information (info_date, title , type ,info_text , url ,status) VALUES ( 2015-06-02 , 新しい商品入荷しました , 1 , 新しい商品のnicepaperが入荷しました。 , http //www63.atwiki.jp/nicepaper/pages/1.html , 1 ); するとidが3になっていることがわかります。 値や文字列の情報を変更してみる。 続いては情報の変更です。 変更 mysql UPDATE information SET type = 2 , info_text = 商品はnicepaperを入荷し、10個限定販売です。 WHERE id = 3 ; 確認 mysql SELECT * FROM information; すると情報が変更できていることを確認することができます。 どうでしょうか。このように、データベースの設計をし、あとはプログラム側でクエリを投げるプログラムを書けば、データベースに挿入や削除や値の変更ができます。ここで使ったMySQLの文法を確認すると SELECT文(データベースからフィールド引き出し) INSERT文(フィールドの挿入) DELETE文(フィールドの削除) UPDATE文(フィールドの更新) WHERE句(フィールドの検索) です。 続いては、phpでMySQLへフォームを使って挿入を作っていきます。
https://w.atwiki.jp/hideaki0121/pages/50.html
MySQLのインストールファイル展開によるインストール apt-get installによるインストール http //y-kit.jp/saba/xp/mysqllinuxinst.htm を参考にしてくださいね. MySQLのインストール (1.サービスの停止) すでに古いMySQLがインストールされているとき # /etc/rc.d/init.d/mysql stop (2.古いバージョンのアンインストール) ここでは /tmp/mysql-4.0.20 に移動してアンインストールする # cd /tmp/mysql-4.0.20 # make uninstall ファイル展開によるインストール 1. ダウンロード webサイトの最新バージョンをダウンロードする. recommendedとなっている「MySQL 5.0」をクリックします。 ここでは MySQL 5.0 -- Generally Available (GA) release for production use をクリックします. 次のページに移動して,inux (non RPM packages) downloads (platform notes)のStandard のDownloadをクリックします. 2.インストール ダウンロードしたファイルを適当なディレクトリ( /usr/local/ )で展開した後,作成ディレクトリに移動する # cd /usr/local # tar xzvf mysql-4.0.20.tar.gz # cd mysql-4.0.20 3.MySQL用のユーザとグループの作成を行います.ここでは,ユーザ名,グループ名ともにmysqlとしています. 以下のように入力し,最後にパスワードの設定があるので入力してください. # groupadd mysql # useradd -g mysql -d /usr/local/mysql mysql # passwd mysql (パスワードを2回入力します.) apt-get installによるインストール 1.GNU/Linux(以下、Debian)では、4.0系列の最新版がインストールされます。rootでapt-getコマンドを次のように実行すれば、最小限必要なMySQLのパッケージがインストールされます。 # apt-get install mysql-server # apt-get install mysql-common # apt-get install mysql-client # apt-get install ibmysqlclient12 2.MySQLサーバーの起動と確認 MySQLのパッケージをインストールすると、自動的にMySQLサーバーが起動されるようになっています。サーバーの停止、再起動に利用するコマンドを表1にまとめましたので、覚えておきましょう。 表1 DebianのMySQLサーバー用コマンドの実行方法 (実行にはroot権限が必要) サーバーの起動 /etc/init.d/mysql start サーバーの停止 /etc/init.d/mysql stop サーバーの再起動 /etc/init.d/mysql restart MySQLサーバーが起動されている場合は、ユーザーで実行例1のように操作し、testデータベースが表示されれば、サーバー起動はOKです。ちなみにtestデータベースは、文字どおりテスト用としてMySQLのデフォルトデータベースとして用意されています。このMySQLの管理モードは、quitコマンドで終了する.
https://w.atwiki.jp/nicepaper/pages/67.html
前回記事MySQLでテーブル作成2ではフィールドの挿入等の確認をしました。次にPHP側でコードを書いてデータベースへ挿入です。色々とセキュリティに関する事項がでてくるので、執筆が長くなるかもしれませんが、ご了承ください。6月2日記事 目次 掟 ユーザが入力したJavaScriptを実行させないhtmlspecialchars関数 MySQLへデータを正確に処理させ、データベースの内容を改ざん削除させないSQLインジェクション対策 PDOの利用 フォームを作ってみる 確認ページ 完了ページ 現在の風潮 感想 掟 phpでMySQLとの連携プログラムを書く際に、注意しなければならない点がいくつかあります。その中で、2つに絞ってまずは話していきたいと思います。非常に最初は混同しがちですが、よく読みながら見ていってください。 ユーザが入力したJavaScriptを実行させないhtmlspecialchars関数 現在、JavaScriptを使ったWEBページは多く存在しています。JavaScriptを利用することで、表示上動きのあるWEBサイト構築が可能になっています。閲覧者、利用者の多くはブラウザでJavaScriptの実行をONにしていることが多く、JavaScriptの利用は必要不可欠になっています。しかし、その部分を悪用し、「JavaScriptで他のサイトに転送(リダイレクト)させたり、悪意のあるコードを読み込ませたりする攻撃」が多発しています。この攻撃を「クロスサイトスクリプティング」といいます。ある利用者が掲示板や皆が閲覧するページにこのJavaScriptのコードを埋め込まれた記事を書いてしまったら、そのページの利用者に多くの迷惑をかけることになります。そのため、 利用者には、JavaScriptの実行コードを埋め込ませてもそれを実行させないための対策 が必要となります。開発者は悪意がなければ開発時にページにJavaScriptコードを埋め込んでしまってもかまいません。あくまで 利用者にJavaScriptのコードを埋め込ませてもよいが、その内容を表示させるときにJavaScriptは実行させないプログラムを書く ということが重要です。それができるのがhtmlspecialchars関数です。 MySQLへデータを正確に処理させ、データベースの内容を改ざん削除させないSQLインジェクション対策 次に、利用者が勝手にデータベースの内容を改ざんしたり、削除させたりしない対策が必要になります。データベースに内容を挿入、更新、削除する場合、当然SQLのクエリを内部で実行させています。そのため、悪意のある利用者がこのSQLクエリを実行させるような内容を記述されてしまったら、データベースの内容が改ざん、削除されてしまいます。URLの末尾にSQLのクエリを書いたり、フォームの部分にSQLのクエリを書けばそのようなことが起きる場合があります。この攻撃のことを「SQLインジェクション」と言います。そのため、 利用者に悪意のあるSQLクエリを入れられても実行させないための対策 が必要になります。以前はmysql_real_escape_stringという関数を使って対策を行っていましたが、色々と悪意のあるコードを実行させる手法が登場してきているため現在はこの関数は 非推奨 となっています。現在では、PDOを使ってデータベースに挿入、更新、取得をさせる方法が主流です。 PDOの利用 PDOの設定についてはPDOの利用をご参照ください。 フォームを作ってみる こちらはただのHTMLを記述していきます。 と宣言したのですが、SELECTタグを使ってフォームを作ると、2月30日や4月31日が作成可能になってしまいますので、公開日等のフォームをjQueryで作っていきたいと思います。もし2月30日や4月31日をクエリで投げてもデフォルト値で指定したもの等になってしまいますので、制限する必要があります。多少横道にはそれますがご了承ください。作り方はjQueryで日付入力フォームを作るをご参照ください。公開日のところ以外のCSS記述は割愛します。各自CSSでうにょうにょやってください。 ファイル名(register.php) !DOCTYPE HTML html lang="ja" head meta charset="utf-8" title 新規作成 /title script type="text/javascript" src="http //ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js" /script script type="text/javascript" src="http //ajax.googleapis.com/ajax/libs/jqueryui/1/jquery-ui.min.js" /script script type="text/javascript" src="http //ajax.googleapis.com/ajax/libs/jqueryui/1/i18n/jquery.ui.datepicker-ja.min.js" /script link type="text/css" href="http //ajax.googleapis.com/ajax/libs/jqueryui/1/themes/ui-lightness/jquery-ui.css" rel="stylesheet" / script type="text/javascript" $(function(){ $("#datepicker").datepicker() }); /script /head body form action="confirm.php" method="post" dl dt 公開日 /dt dd input type="text" name="form_date" id="datepicker" /dd !--textにした理由はwebkit対策-- dt 種類 /dt dd select name="form_type" option value="1" selected ニュース /option option value="2" 更新情報 /option option value="3" 入荷情報 /option option value="4" その他 /option /select dt タイトル /dt dd input type="text" name="form_title" size="40" maxlength="30" /dd dt 内容 /dt dd textarea name="form_info_text" cols="40" rows="5" /textarea /dd dt URL /dt dd input type="url" name="form_url" size="40" /dd dt ステータス /dt dd select name="form_status" option value="2" selected 公開 /option option value="1" 下書き /option /select /dd /dl input type="submit" name="form_submit" value="確認" /form /body /html データベースに挿入する名前とフォームの部品の名前を区別するためにフォームの方にはform_という名前を付けておきました。 するとこうなります。 確認ページ こちらは、クロスサイトスクリプティング対策を兼ねたコードを記述してきます。 JavaScriptのコードを実行させない確認表示が必要になります。「別に、埋め込んだ人が自分で自分を攻撃してどうするの?」という方もいらっしゃると思いますが、HTMLを正確に出力するということはある意味標準で考えなければならないことなので、htmlspecialchars関数を使って記述していきます。ここからはphpを実行させる環境を用意してください。 コード(ファイル名:confirm.php) !DOCTYPE HTML html lang="ja" head meta charset="utf-8" title 確認画面 /title /head body ?php /*特定のURIから送信された時のみ実行*/ if($_SERVER["HTTP_REFERER"] == (empty($_SERVER["HTTPS"]) ? "http //" "https //").$_SERVER[ HTTP_HOST ]."/register.phpまでのフォルダを記述/register.php"){ /*まずはエラー処理*/ $error = ;/*初期化。以降エラーがあれば$errorに格納していく。*/ if($_POST[ form_date ] == ) $error .= 日付が選択されていません。 br ;/*①*/ if(preg_match( /^([1-9][0-9]{3})\/(0[1-9]{1}|1[0-2]{1})\/(0[1-9]{1}|[1-2]{1}[0-9]{1}|3[0-1]{1})$/ , $_POST[ form_date ])){}else{ $error .= 不正な日付です。 br ;} if($_POST[ form_type ] == ) $error .= 投稿種類が選択されていません。 br ; if($_POST[ form_title ] == ) $error .= タイトルが入力されていません。 br ; if(mb_strlen($_POST[ form_title ]) 30) $error .= 30文字以内にしてください br ; if($_POST[ form_info_text ] == ) $error .= 内容が入力されていません。 br ; if(mb_strlen($_POST[ form_info_text ]) 1000) $error .= 1000文字以内にしてください br ; if($_POST[ form_status ] == ) $error .= 状態が選択されていません。 br ; echo $error;/*エラーがあればエラーを表示*/ if($error == ){ echo dl dt 日付 /dt dd .htmlspecialchars($_POST[ form_date ]). /dd dt 種類 /dt dd ; switch ($_POST[ form_type ]){ case 1 echo ニュース ; break; case 2 echo 更新情報 ; break; case 3 echo 入荷情報 ; break; case 4 echo その他 ; break; default echo その他 ; } echo /dd dt タイトル /dt dd .htmlspecialchars($_POST[ form_title ]). /dd dt 内容 /dt dd .nl2br(htmlspecialchars($_POST[ form_info_text ])). /dd dt URL /dt dd .htmlspecialchars($_POST[ form_url ]). /dd dt 状態 /dt dd ; switch ($_POST[ form_status ]){ case 0 echo 削除 ; break; case 1 echo 下書き ; break; case 2 echo 公開 ; break; default echo 削除 ; } echo /dd /dl form action="complete.php" method="post" input type="hidden" name="form_date" value=" .htmlspecialchars($_POST[ form_date ]). " input type="hidden" name="form_type" value=" .htmlspecialchars($_POST[ form_type ]). " input type="hidden" name="form_title" value=" .htmlspecialchars($_POST[ form_title ]). " input type="hidden" name="form_info_text" value=" .htmlspecialchars($_POST[ form_info_text ]). " input type="hidden" name="form_url" value=" .htmlspecialchars($_POST[ form_url ]). " input type="hidden" name="form_status" value=" .htmlspecialchars($_POST[ form_status ]). " p この内容でよろしいでしょうか? /p input type="submit" name="submit" value="はい" input type="button" value="戻る" onClick="history.back()" /form ; } }else{ echo 正しいアクセスを心がけてください。 ; } ? /body /html 解説 ①$error .= は前の$errorという変数に付け加えていくという意味です。 表示はこのようになります。 完了ページ こちらは、SQLインジェクション対策を兼ねたコードを記述していきます。 ここではMySQLのINSERT文を投げていきます。 ファイル名(complete.php) !DOCTYPE HTML html lang="ja" head meta charset="utf-8" title 完了 /title /head body ?php /*特定のURIから送信された時のみ実行*/ if($_SERVER["HTTP_REFERER"] == (empty($_SERVER["HTTPS"]) ? "http //" "https //").$_SERVER[ HTTP_HOST ]."/confirm.phpまでのフォルダ記述/confirm.php"){ $dsn = mysql dbname=データベース名;host=ローカルホスト;port=ポート番号 ; $user = ユーザ名 ; $password = ユーザパスワード ; $dbh = new PDO($dsn, $user, $password); try{ //成功時対応 $stmt = $dbh - prepare("INSERT INTO テーブル名 ( info_date ,title,type,info_text,url,status) VALUES ( info_date, title, type, info_text, url, status)"); $stmt- bindParam( info_date , $_POST[ form_date ], PDO PARAM_STR); $stmt- bindParam( title , $_POST[ form_title ], PDO PARAM_STR); $stmt- bindParam( type , $_POST[ form_type ], PDO PARAM_INT); $stmt- bindParam( info_text , $_POST[ form_info_text ], PDO PARAM_STR); $stmt- bindParam( url , $_POST[ form_url ], PDO PARAM_STR); $stmt- bindParam( status , $_POST[ form_status ], PDO PARAM_INT); $stmt- execute();//実行 switch ($_POST[ form_status ]){ case 0 echo 削除しました。 br ; break; case 1 echo 下書きに保存しました。 br ; break; case 2 echo 公開対象になりました。 br ; break; default echo 削除しました。 br ; } print a href="register.php" 新規作成へ戻る /a ; }catch (PDOException $e){//失敗時対応 print( Connection failed .$e- getMessage()); die(); } $dbh = null; }else{ echo 正しいアクセスを心がけてください。 ; } ? /body /html 現在の風潮 現在、確認ページを作らず、挿入される値をチェックして、エラーがなければすぐ挿入という方法も流行ったりしています。その記事はいつか作っていきたいと思います。初回ということでSQLインジェクションとクロスサイトスクリプティングの利用ということで、このような記事を作っていきました。 感想 この方法だと、complete.phpで更新ボタンを押すと、またデータが挿入されてしまいます。Sessionファイルを使って、フォームを受け取り等をし、完了したら、Sessionファイルを空にする的なコードを書けば、それが防げます。 我ながらに下手なコードだなぁ・・・。もっと色々と変えなければならないことが山ほどあります。まあ、PHPでこんな風に書くよ的なことがわかればいいなと思ったりもします。(考え方甘い?) 次回は挿入したデータを取得していき、表示したいと思います。ページ名は、PHPとMySQLでデータの取得です。 コメントお待ちしております。 名前 コメント
https://w.atwiki.jp/pangyaserver/pages/21.html
テーブルメモaccount black_papel_item black_papel_qntd_prob black_papel_rate pangya_box_item pangya_box_table_item pangya_cardpack pangya_cards pangya_character_information pangya_memorial_shop_coin_item pangya_memorial_shop_level pangya_memorial_shop_rare_item pangya_memorial_shop_rate scratchy_item scratchy_rate user_info プロシージャProcFirstUserLogin ProcNewUser USP_ADD_ITEM まとめてアイテムぶちこみたい使い方 テーブルメモ account Sex 性別アイコン 0=男 1=女 capability GMアカウント 0=通常 4=GM black_papel_item PPガチャ出現リスト ノーマルアイテムやレアアイテム等自由に追加できる black_papel_qntd_prob 当選アイテムの個数(アイテムの右下に出る数字) 4以上のパターンを作って増やすことも可能 black_papel_rate PPガチャのレート pangya_box_item 開封タイプのアイテムリスト このリストにないものは開封エラーになる pangya_box_table_item 開封アイテムから出るアイテムのリスト pangya_cardpack カードパックのリスト このリストにないものは開封エラーになる pangya_cards カードパックから出るカードのリスト pangya_character_information Mastery キャラクターマスタリー 0~10 pangya_memorial_shop_coin_item typeid メモリアルコインのtypeid tipo コインの種類 0 ノーマル、1 プレミアム、2・3 スペシャル valor_1とvalor_2の用途は不明 テーブルの内容はMemorialShopCoinItem.sffから変換されたものと同じ pangya_memorial_shop_level メモリアルレベルがgacha_fim以下のアイテムが出現リストとなる プレミアムコインの場合24固定 スペシャルコインはレベル関係なし pangya_memorial_shop_rare_item pangya_memorial_shop_coin_itemの数値によってitemテーブルからレアアイテムが選ばれる レア選別内容はProcGetMemorialRareItemに書かれていて ① コインのcharacter_typeが0か82 → コインのoutro_item=アイテムのcharacter_type ② コインのcharacter_typeが0か82以外 → コインのcharacter_type=アイテムのcharacter_type ③ コインのoutro_itemが0以外 → コインのoutro_item=アイテムのoutro_item ④ コインのtipo_itemが0以外 → コインのtipo_item=アイテムのtipo_itemまたはsexo の条件を満たすアイテムが候補になる たとえばtypeid 436208299 Memorial Coin (NL)の場合 character_type 82、outro_item 28、tipo_item 11となっているので アイテムテーブルから character_type=28またはtipo_item=11またはsexo=11のアイテムが出現リストになる このアイテムテーブルはMemorialShopRareItem.iffから変換されたもので内容は同じ このiff自体はメモリアルコイン使用時に使われることはないようだ 日本のiffも同様に変換可能だが日本はキャラクターのスペシャルコインは実装されていなかったのでcharacter_typeの値がすべて0になっており修正が必要 またメモリアルコイン自体にも仮と書かれているようにデータベースも不完全なものになっている キャラクターコインはセシリア、ルーシア、スピカが日米タイともに実装されていないがtypeidを追加することで作ることもできる(本家で実装されていたかは不明) pangya_memorial_shop_rate Rare メモリアルコインのレア確率 プレミアムコインは+400(初期値) scratchy_item Active スクラッチの出現状態 1=有効化 scratchy_rate Rare Item スクラッチのレア確率 user_info level レベル 0~70 Pang 所持PP BIGINTの上限(19桁)(*1) Cookie 所持CP BIGINTの上限(19桁) プロシージャ ProcFirstUserLogin 初期アカウントの設定が変えられる CALL USP_ADD_ITEM(16個の引数)でアイテムを追加できる ほとんどは個数指定を変えればいけるが種類によって必要な引数が違う場合がある ProcNewUser アカウント作成時にデータベースに追加される項目 USP_ADD_ITEM アイテムに応じてSQLが実行される 引数に指定した数値がpangya_item_warehouseの同名カラムに入る クラブセット USP_ADD_ITEM(IDUSER, 0, 0, -1, typeid, 0, 0, C0, C1, C2, C3, C4, 0, 0, 0, 0); typeid = アイテムID C0~C4 = クラブセットの性能値 キャディ USP_ADD_ITEM(IDUSER, 0, 0, -1, typeid, 0, Period, 0, 0, 0, 0, 0, 0, 0, 0, 0); typeid = キャディID Period = 0 通常キャディ。雇用キャディも永久雇用になる Period = 30 雇用キャディ。通常キャディが雇用になることはない まとめてアイテムぶちこみたい Add Item with SQL BY CNO Add Item.rar を使う ブラウザでは閲覧のみで編集できない 左上の ファイル ダウンロード からxlsx形式で保存する 使い方 画像の赤い枠で囲んだ部分が右のINSERT分とリンクしている UIDを入れたいユーザーのIDにする キャディIDも変えたり増やしたりできる データベース名が`pangya`になっているので`pangya-ssd`に変更してオートフィル All PartはINSERT分が上にあるのでそこを`pangya-ssd`に変えるだけでいい 緑枠のようにINSERTの行を上から下に囲ってコピーするとINSERT文をまとめてコピーできる あとはこれをMySQLクライアントのSQLに貼り付けて実行すれば一度にデータが更新される あまり入れすぎるとアイテムが満タンになってしまうらしい
https://w.atwiki.jp/r1025/pages/57.html
foreach !--{foreach from=$row item=value name=test key=keyname}-- !--{if $smarty.foreach.test.first}-- tr valign="top" th 一番最初の名前 /th th 住所 /th /tr !--{/if}-- tr td !--{$value- name}-- /td td !--{$value- address}-- /td /tr !--{if $smarty.foreach.test.last}-- tr valign="top" th 一番最後の名前 /th th 住所 /th /tr !--{/if}-- !--{/foreach}-- トータル: - /今日: - /昨日: -
https://w.atwiki.jp/parepan/pages/73.html
テンプレート内でJavascriptを使用すると以下のようなエラーが 発生します。 Fatal error Smarty error [in テンプレートファイル.tpl line 12] syntax error unrecognized tag 対策として {literal} script language="JavaScript" type="text/JavaScript" !-- function sampleJava() { なんとか; } //-- /script {/literal} というように{literal}...{/literal}でSmartyの解釈から外してやるか、 script language="JavaScript" type="text/JavaScript" src="sampleJava.js" /script というふうに外部ファイル読み込みにしてあげないといけない。